#ifndef GRAYVALUEMEASUREMENTDRAWERFACTORY_H
#define GRAYVALUEMEASUREMENTDRAWERFACTORY_H

#include <QObject>
#include <QGraphicsScene>
#include <QVariantMap>
#include <QPointF>
#include <memory>

// 提前声明
class HorizontalSingleLineDrawer;
class VerticalSingleLineDrawer;
class RectangleRegionDrawer;
enum class MeasurementMode : int;

/**
 * @brief 灰度值测量绘制器工厂类
 * 
 * 用于创建和管理灰度值测量算法中的各种绘制器实例，支持不同的测量模式。
 * 提供统一的接口来获取对应的绘制器，并管理它们的生命周期。
 * 支持初始化不同类型的测量工具，并更新变换信息。
 */
class GrayValueMeasurementDrawerFactory : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父对象
     */
    explicit GrayValueMeasurementDrawerFactory(QObject *parent = nullptr);

    /**
     * @brief 析构函数
     */
    ~GrayValueMeasurementDrawerFactory();

    /**
     * @brief 设置图形场景
     * @param scene 图形场景指针
     */
    void setScene(QGraphicsScene *scene);

    /**
     * @brief 根据测量模式获取对应的绘制器
     * @param mode 测量模式
     * @return 绘制器实例指针
     */
    QObject *getDrawer(MeasurementMode mode);

    /**
     * @brief 初始化测量工具
     * @param mode 测量模式
     * @param imageWidth 图像宽度
     * @param imageHeight 图像高度
     * @param scale 缩放比例
     * @param offset 偏移量
     */
    void initializeMeasurementTool(MeasurementMode mode, int imageWidth, int imageHeight, 
                                 double scale, const QPointF &offset);

    /**
     * @brief 从结果中恢复测量工具
     * @param mode 测量模式
     * @param result 测量结果
     * @param scale 缩放比例
     * @param offset 偏移量
     */
    void restoreFromResult(MeasurementMode mode, const QVariantMap &result, 
                         double scale, const QPointF &offset);

    /**
     * @brief 更新变换信息
     * @param mode 测量模式
     * @param scale 缩放比例
     * @param offset 偏移量
     */
    void updateTransformInfo(MeasurementMode mode, double scale, const QPointF &offset);

    /**
     * @brief 设置绘制器样式参数
     * @param params 样式参数映射
     */
    void setParameters(const QVariantMap &params);

    /**
     * @brief 清除所有绘制器的绘制内容
     */
    void clearAll();
    
    /**
     * @brief 更新缩放比例
     * @param scale 新的缩放比例
     */
    void updateScale(double scale);

signals:
    /**
     * @brief 矩形区域变化信号
     * @param rect 变化后的矩形区域（图像坐标）
     */
    void rectangleChanged(const QRectF &rect);
    
    /**
     * @brief 水平线变化信号
     * @param startPoint 起点（图像坐标）
     * @param endPoint 终点（图像坐标）
     */
    void horizontalLineChanged(const QLineF &lineImage);
    
    /**
     * @brief 垂直线变化信号
     * @param startPoint 起点（图像坐标）
     * @param endPoint 终点（图像坐标）
     */
    void verticalLineChanged(const QLineF &lineImage);

private:
    // 各种绘制器实例
    std::unique_ptr<HorizontalSingleLineDrawer> m_horizontalSingleLineDrawer;
    std::unique_ptr<VerticalSingleLineDrawer> m_verticalSingleLineDrawer;
    std::unique_ptr<RectangleRegionDrawer> m_rectangleRegionDrawer;
    
    // 图形场景
    QGraphicsScene *m_scene;
};

#endif // GRAYVALUEMEASUREMENTDRAWERFACTORY_H
